// 静态链表
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct static_list
{
    int val;
    int cur;
} s_list[MAX_SIZE];
// 备用链表表头位置
#define SPARE 0
// 静态链表表头位置
#define HEAD 1

void _init_(s_list &sl)
{
    for (int i = 0; i < MAX_SIZE; i++)
    {
        sl[i].cur = i + 1;
    }
    sl[MAX_SIZE - 1].cur = 0;
}
int _malloc_(s_list &sl)
{
    int i = sl[SPARE].cur;
    sl[SPARE].cur = sl[i].cur;
    return i;
}
void _free_(s_list &sl, int i)
{
    sl[i].cur = sl[SPARE].cur;
    sl[SPARE].cur = i;
}
bool insert(s_list &sl, int x)
{
    int i = _malloc_(sl);
    if (!i)
        return false;
    sl[i].val = x;
    sl[i].cur = sl[1].cur;
    sl[1].cur = i;
    return true;
}
bool creat(s_list &sl, int date[], int len)
{
    // 初始化
    _init_(sl);
    int s = _malloc_(sl);
    sl[s].cur = s;
    for (int i = 0; i < len; i++)
    {
        int n = _malloc_(sl);
        if (!n)
            return false;
        insert(sl, date[i]); //尾插法插入
    }
    return true;
}

void uion(s_list &sl, int b[], int len)
{
    for (int i = 0; i < len; i++)
    {
        int p = sl[1].cur, pre = 1;
        while (p != 1 && sl[p].val != b[i])
        {
            pre = p;
            p = sl[p].cur;
        }
        if (p == 1)
        {
            insert(sl, b[i]);
        }
        else
        {
            sl[pre].cur = sl[p].cur;
            _free_(sl, p);
        }
    }
}

void show(s_list sl)
{
    int i = sl[1].cur;
    while (i != 1)
    {
        printf("%d ", sl[i].val);
        i = sl[i].cur;
    }
    printf("\n");
}

int main()
{
    /*******************code*******************/
    s_list s1, s2;
    int a[] = {10, 1, 4, 5, 7, 3};
    int b[] = {10, 1, 4, 5, 7, 3};
    creat(s1, a, 6);
    // insert(s1, 15);
    show(s1);
    uion(s1, b, 6);
    show(s1);
    /******************************************/
    fflush(stdin);

    printf("\n\n****************************\n");
    printf("Press Enter key to continue\n");
    getchar();
    return 0;
    /******************************************/
}
